console.log("ts 测试");

// 定义一个模板字符串类型，用于分割字符串并创建联合类型
type SplitStringToUnion<T extends string> = T extends `${infer Head}, ${infer Tail}`
  ? Head | SplitStringToUnion<Tail>
  : T;

// 使用 SplitStringToUnion 类型
type MyKeys = SplitStringToUnion<"key1, key2, key3">;
// MyKeys 现在是一个联合类型：'key1' | 'key2' | 'key3'

// 测试 MyKeys 类型
const testKeys: MyKeys = "key1"; // 正确
// const testKeys: MyKeys = 'key4'; // 错误，因为 'key4' 不是 'key1' | 'key2' | 'key3' 中的一个

// // 定义一个类型，它将字符串映射到其大写形式
// type Uppercase<T> = T extends string ? UppercaseValue<T> : never;

// // 辅助类型，用于转换字符串为大写
// type UppercaseValue<T extends string> = `${T}` extends `${infer U}` ? U : never;
type AA = Uppercase<"hello">;
// AA 类型为 'H' | 'E' | 'L' | 'L' | 'O'

// 使用 Uppercase 类型
type MyString = "hello";
type MyUppercaseString = Uppercase<MyString>; // "HELLO"

// 测试 MyUppercaseString 类型
// const testString: MyUppercaseString = 'HELLO'; // 正确
// const invalidString: MyUppercaseString = 'hello'; // 错误，因为 'hello' 不是大写形式

const fn = <T extends string>(s: T) => {
  return s.toLocaleUpperCase() as Uppercase<T>;
};

const a = "aaa";
const b = fn(a);
